package com.example.myapplication;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.myapplication.bean.User;
import com.example.myapplication.bean.Food;

import java.util.ArrayList;
import java.util.List;

// 定义有关SQLite数据库的相关操作的类
public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    // 数据库名称
    private static final String DA_NAME = "mySQLite.db";
    private static final int DATABASE_VERSION = 10;  // 增加版本号
    // User 表名称及建表语句
    private static final String TABLE_NAME_STUDENT = "student";
    // 创建用户表
    private static final String CREATE_TABLE_STUDENT =
            "create table " + TABLE_NAME_STUDENT +
                    " (id integer primary key autoincrement, name text, number text, number_fin text);";

    // Food 表名称及建表语句
    private static final String TABLE_NAME_FOOD = "food";
    // 这里采用文本类型存储日期（格式：yyyy-MM-dd），你也可以使用INTEGER存储时间戳
    // 创建食物表
    private static final String CREATE_TABLE_FOOD =
            "CREATE TABLE IF NOT EXISTS food (" +
                    "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "name TEXT NOT NULL, " +
                    "store_date TEXT, " +
                    "expiry_date TEXT, " +
                    "count INTEGER" +
                    ")";


    // 构造函数
    public MySQLiteOpenHelper(Context context) {
        super(context, DA_NAME, null, DATABASE_VERSION);
    }

    // 当数据库首次创建时调用，执行建表语句
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_STUDENT);  // 创建 student 表
        db.execSQL(CREATE_TABLE_FOOD);       // 创建 food 表
        Log.d("DB", "food 数据库表创建成功");
    }

    // 预留，如果需要可以更新数据库的表
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//        // 删除旧表（如果存在）
//        db.execSQL("DROP TABLE IF EXISTS food");
//        db.execSQL("DROP TABLE IF EXISTS student");
//        // 重新创建所有表
//        onCreate(db);
    }

    // =================== User 表操作方法 ===================

    /**
     * 插入一条学生信息
     * @param user 要插入的 User 对象
     * @return 新记录的行号（若返回 -1 表示插入失败）
     */
    public long insertData(User user) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", user.getName());
        values.put("number", user.getNumber());
        values.put("number_fin", user.getNumber_fin());
        return db.insert(TABLE_NAME_STUDENT, null, values);
    }

    /**
     * 根据姓名查询学生数据
     * @param name 查询条件，学生姓名
     * @return 符合条件的 User 对象集合
     */
    // 1、先找到数据库对象
    // 2、再创建一个list学生类列表
    // 3、然后通过数据库处理类库的方法db.query()获取cursor数据库游标，类似于C的数组首地址
    // 4、接着通过游标循环遍历获取相应属性对应的相应的值，并创建student对象set设置相应的值
    // 5、最后list学生类列表添加学生student对象
    // 6、关闭游标，关闭数据库
    public List<User> queryFromDbByName(String name) {
        SQLiteDatabase db = getWritableDatabase();
        List<User> userList = new ArrayList<>();
        // 使用 ? 占位符防止 SQL 注入
        Cursor cursor = db.query(TABLE_NAME_STUDENT, null, "name=?", new String[]{name}, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                @SuppressLint("Range") String name1 = cursor.getString(cursor.getColumnIndex("name"));
                @SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndex("number"));
                User user = new User();
                user.setName(name1);
                user.setNumber(number);
                userList.add(user);
            }
            cursor.close();
        }
        return userList;
    }

    // =================== Food 表操作方法 ===================

    /**
     * 插入一条食物信息到 food 表中
     * @param food 要插入的 Food 对象
     * @return 新记录的行号，若返回 -1 表示插入失败
     */
    public long insertFood(Food food) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", food.getName()); // 添加食物名称
        values.put("store_date", food.getStoreDate()); // 添加食物存放日期
        values.put("expiry_date", food.getExpiryDate()); // 添加食物到期日期
        values.put("count", food.getCount()); // 添加食物数量

        long result = db.insert("food", null, values);
        db.close();
        return result;
    }



    /**
     * 查询所有食物信息
     * @return Food 对象的集合，按照存放日期降序排列
     */
    public List<Food> queryAllFood() {
        SQLiteDatabase db = getReadableDatabase();
        List<Food> foodList = new ArrayList<>();
        Cursor cursor = db.query(TABLE_NAME_FOOD, null, null, null, null, null, "store_date desc");
        if (cursor != null) {
            while (cursor.moveToNext()) {
                Food food = new Food();
                // 获取每一列的数据
                food.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id")));
                food.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));
                food.setStoreDate(cursor.getString(cursor.getColumnIndexOrThrow("store_date")));
                food.setExpiryDate(cursor.getString(cursor.getColumnIndexOrThrow("expiry_date")));
                foodList.add(food);
            }
            cursor.close();
        }
        return foodList;
    }

    /**
     * 根据 food 表中记录的 id 删除对应的记录
     * @param id 食物记录的 id
     * @return 删除的记录数，若为 0 表示未删除成功
     */
    // 根据食物id删除食物表的相应的id的那行食物元组
    public int deleteFoodById(int id) {
        SQLiteDatabase db = getWritableDatabase();
        return db.delete(TABLE_NAME_FOOD, "id=?", new String[]{String.valueOf(id)});
    }
    // 查询所有食物
    // 遍历食物表的每行数据元组
    public List<Food> getAllFood() {
        List<Food> foodList = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = null;

        try {
            cursor = db.rawQuery("SELECT * FROM food", null);
            while (cursor.moveToNext()) {
                Food food = new Food();
                food.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id")));
                food.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));
                food.setStoreDate(cursor.getString(cursor.getColumnIndexOrThrow("store_date")));
                food.setExpiryDate(cursor.getString(cursor.getColumnIndexOrThrow("expiry_date")));
                foodList.add(food);
            }
        } catch (Exception e) {
            Log.e("DB_ERROR", "查询食物数据失败", e);
        } finally {
            if (cursor != null) cursor.close();
            db.close();
        }
        return foodList;
    }
    // 根据食物id更新食物表的食物的数量count
    public int updateFoodCount(int id, int newCount) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("count", newCount);
        int count = db.update("food", values, "id=?", new String[]{String.valueOf(id)});
        db.close();
        return count;
    }

}
